home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / DJ111M3.ZIP / go32 / ed / symify.c
C/C++ Source or Header  |  1994-02-09  |  3KB  |  133 lines

  1. #include <stdio.h>
  2. #include "ed.h"
  3. #include "syms.h"
  4.  
  5. #define SC(r,c) (*(char *)(sc + (r)*ScreenCols() + (c)))
  6. #define SW(r,c) (*(sc + (r)*ScreenCols() + (c)))
  7.  
  8. TSS a_tss;
  9. main(int argc, char **argv)
  10. {
  11.   int r, c;
  12.   short *sc;
  13.   char *n;
  14.   char buf[90];
  15.   int i, line;
  16.   word32 v;
  17.   word32 d;
  18.   char *func, *file;
  19.   FILE *ofile=0;
  20.   FILE *ifile=0;
  21.  
  22.   if (argc < 2)
  23.   {
  24.     fprintf(stderr, "Usage: symify [-o <outfile>] [-i <corefile>] <program>\n");
  25.     fprintf(stderr, "This program replaces the stack dumps from go32 with debug info\n");
  26.     return 1;
  27.   }
  28.   while (argv[1][0] == '-')
  29.   {
  30.     if ((strcmp(argv[1], "-o") == 0) && (argc > 3))
  31.     {
  32.       ofile = fopen(argv[2], "w");
  33.       if (ofile == 0)
  34.         fprintf(stderr, "Error: unable to open file %s\n", argv[2]);
  35.       argc -= 2;
  36.       argv += 2;
  37.     }
  38.     if ((strcmp(argv[1], "-i") == 0) && (argc > 3))
  39.     {
  40.       ifile = fopen(argv[2], "r");
  41.       if (ifile == 0)
  42.         fprintf(stderr, "Error: unable to open file %s\n", argv[2]);
  43.       argc -= 2;
  44.       argv += 2;
  45.     }
  46.   }
  47.   syms_init(argv[1]);
  48.  
  49.   if (ifile)
  50.   {
  51.     char line[1000];
  52.     if (ofile == 0)
  53.       ofile = stdout;
  54.     while (fgets(line, 1000, ifile))
  55.     {
  56.       if (strncmp(line, "  0x", 4) == 0)
  57.       {
  58.         int lineno;
  59.         sscanf(line+4, "%x", &v);
  60.         func = syms_val2name(v, &d);
  61.         file = syms_val2line(v, &lineno, 0);
  62.         fprintf(ofile, "  0x%08x", v);
  63.         if (func)
  64.         {
  65.           fprintf(ofile, " %s", func);
  66.           if (d)
  67.             fprintf(ofile, "%+d", d);
  68.         }
  69.         if (file)
  70.         {
  71.           if (func)
  72.             fprintf(ofile, ", ");
  73.           fprintf(ofile, "line %d of %s", lineno, file);
  74.         }
  75.         fputc('\n', ofile);
  76.       }
  77.       else
  78.         fputs(line, ofile);
  79.     }
  80.     return 0;
  81.   }
  82.  
  83.   sc = (short *)malloc(ScreenRows() * ScreenCols() * 2);
  84.  
  85.   ScreenRetrieve(sc);
  86.  
  87.   for (r=0; r<ScreenRows(); r++)
  88.   {
  89.     if (SC(r,0) == ' ' && SC(r,1) == ' ' && SC(r,2) == '0' && SC(r,3) == 'x')
  90.     {
  91.       buf[8] = 0;
  92.       for (i=0; i<8; i++)
  93.         buf[i] = SC(r, i+4);
  94.       sscanf(buf, "%x", &v);
  95.       func = syms_val2name(v, &d);
  96.       file = syms_val2line(v, &line, 0);
  97.       buf[0] = 0;
  98.       if (func)
  99.       {
  100.     strcpy(buf, func);
  101.     if (d)
  102.       sprintf(buf+strlen(buf), "%+d", d);
  103.       }
  104.       if (file)
  105.       {
  106.         if (buf[0])
  107.           strcat(buf, ", ");
  108.         sprintf(buf+strlen(buf), "line %d of %s", line, file);
  109.       }
  110.       if (buf[0])
  111.         for (i=0; buf[i]; i++)
  112.           SW(r, 15+i) = 0x0f00 + buf[i];
  113.     }
  114.   }
  115.  
  116.   if (ofile)
  117.   {
  118.     for (r=0; r<ScreenRows(); r++)
  119.     {
  120.       c = 0;
  121.       for (i=0; i<ScreenCols(); i++)
  122.         if (SC(r, i) != ' ')
  123.           c = i;
  124.       for (i=0; i<=c; i++)
  125.         fputc(SC(r,i), ofile);
  126.       fputc('\n', ofile);
  127.     }
  128.     fclose(ofile);
  129.   }
  130.   else
  131.     ScreenUpdate(sc);
  132. }
  133.